home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_03_02 / 3n02038a < prev    next >
Text File  |  1991-11-15  |  3KB  |  96 lines

  1. {Buttons - Extensions to ObjectWindows Copyright (C) Doug Overmyer 7/1/91}
  2. unit Buttons;
  3. {************************  Interface    ***********************}
  4. interface
  5. uses WinTypes, WinProcs, WinDos, Strings, WObjects;
  6. type
  7. PODButton = ^TODButton;
  8. TODButton = object(TButton)
  9.     HBmp :HBitmap;
  10.   State:Integer;
  11.   constructor    Init(AParent:PWindowsObject; AnID:Integer;ATitle:PChar;
  12.       X,Y,W,H:Integer;IsDefault:Boolean;BMP:PChar);
  13.   destructor    Done;virtual;
  14.   procedure    DrawItem(var Msg:TMessage);virtual;
  15. end;
  16. {************************  Implementation      **********************}
  17. implementation
  18. constructor    TODButton.Init(AParent:PWindowsObject; AnID:Integer;ATitle:PChar;
  19.        X,Y,W,H:Integer;IsDefault:Boolean;BMP:PChar);
  20. begin
  21.     TButton.Init(AParent,AnID,ATitle,X,Y,W,H,IsDefault);
  22.   Attr.Style := Attr.Style or bs_OwnerDraw;
  23.   HBmp := LoadBitmap(HInstance,BMP);
  24. end;
  25.  
  26. destructor    TODButton.Done;
  27. begin
  28.     DeleteObject(HBmp);
  29.     TButton.Done;
  30. end;
  31.  
  32. procedure    TODButton.DrawItem(var Msg:TMessage);
  33. var
  34.     TheDC,MemDC:HDc;
  35.     ThePen,Pen1,Pen2,OldPen:HPen;
  36.   TheBrush,OldBrush:HBrush;
  37.   OldBitMap:HBitMap;
  38.   LPts,RPts:Array[0..2] of TPoint;
  39.   PDIS :^TDrawItemStruct;
  40.   X,Y,W,H:Integer;
  41.   PenWidth,OffSet:Integer;
  42.   DBU:LongRec;
  43. begin
  44.     LongInt(DBU) := GetDialogBaseUnits;                  
  45.     PDIS := Pointer(Msg.lParam);
  46.   if PDIS^.itemAction = oda_Focus then Exit;
  47.     if ((PDIS^.itemAction and oda_Select ) > 0) and
  48.       ((PDIS^.itemState and ods_Selected) > 0) then State := 1 else State := 0;                     {1 = depressed}
  49.   X := PDIS^.rcItem.left;    Y := PDIS^.rcItem.top;
  50.   W := PDIS^.rcItem.right-PDIS^.rcItem.left;  H := PDIS^.rcItem.bottom-PDIS^.rcItem.top;
  51.   OffSet := Round(H / (DBU.lo * 4));               {scale highlites based on size}
  52.   PenWidth := OffSet;
  53.   LPts[0].x := W; LPts[0].y := 0;
  54.   LPts[1].x := 0; LPts[1].y := 0;
  55.   LPts[2].x := 0; LPts[2].y := H;
  56.   RPts[0].x := 0; RPts[0].y := H;
  57.   RPts[1].x := W; RPts[1].y := H;
  58.   RPts[2].x := W; RPts[2].y := 0;
  59.   MemDC := CreateCompatibleDC(PDIS^.HDC);
  60.   OldBitMap := SelectObject(MemDC,HBMP);
  61.   if State = 0 then BitBlt(PDIS^.HDC,X,Y,W,H, MemDC,0,0,SrcCopy)
  62.       else BitBlt(PDIS^.HDC,X+OffSet,Y+OffSet,W,H, MemDC,0,0,SrcCopy);
  63.   SelectObject(MemDC,OldBitMap);
  64.   DeleteDC(MemDC);
  65.     Pen1 := CreatePen(ps_Solid,OffSet,$00000000);
  66.   OldPen := SelectObject(PDIS^.HDC,Pen1);
  67.   PolyLine(PDIS^.HDC,LPts,3);
  68.   PolyLine(PDIS^.HDC,RPts,3);
  69.   SelectObject(PDIS^.HDC,OldPen);
  70.   DeleteObject(Pen1);
  71.   LPts[0].x := W-OffSet;     LPts[0].y := OffSet;
  72.   LPts[1].x := OffSet;         LPts[1].y := OffSet;
  73.   LPts[2].x := OffSet;        LPts[2].y := H-OffSet;
  74.   RPts[0].x := OffSet;         RPts[0].y := H-OffSet;
  75.   RPts[1].x := W-OffSet;     RPts[1].y := H-OffSet;
  76.   RPts[2].x := W-OffSet;     RPts[2].y := OffSet;
  77.   if State = 0 then
  78.       begin
  79.         Pen1 := CreatePen(ps_Solid,PenWidth,$00FFFFFF);       {white hilite}
  80.     Pen2 := CreatePen(ps_Solid,PenWidth,$00808080);
  81.     end
  82.   else
  83.       begin
  84.       Pen1 := CreatePen(ps_Solid,PenWidth,$00808080);       {black hilite}
  85.         Pen2 := CreatePen(ps_Solid,Penwidth,$00808080);
  86.     end;
  87.   OldPen := SelectObject(PDIS^.HDC,Pen1);
  88.   PolyLine(PDIS^.HDC,LPts,3);
  89.   SelectObject(PDIS^.HDC,Pen2);
  90.   DeleteObject(Pen1);
  91.   PolyLine(PDIS^.HDC,RPts,3);
  92.   SelectObject(PDIS^.HDC,OldPen);
  93.   DeleteObject(Pen2);
  94. end;
  95. end.
  96.